# -*- coding: utf-8 -*-

'''eof
name:最近3M两次订烟间隔最长周期数
code:Mon3MaxPeriods
tableName:
columnName:
groups:烟商
dependencies:BTM
type:常用指标
datasourceType:在线指标
description:
eof'''

import sys
import pandas as pd
import datetime
import re

reload(sys)
sys.setdefaultencoding('utf-8')


def Mon3MaxPeriods():
    null_type_list = ['',None,'null','Null','/', ' ']
    indent_date = []
    try:
        BTM_ = BTM['data']
        if Formate(BTM_.get('bbd_dotime')) is not None:
            ApplTime = datetime.datetime.strptime(Formate(BTM_['bbd_dotime']), '%Y%m%d')
            last_year_days_list = [(ApplTime - pd.tseries.offsets.DateOffset(days=i)).strftime('%Y%m%d') \
                                   for i in [90, 0]]
        else:
            last_year_days_list = [(datetime.datetime.now() - pd.tseries.offsets.DateOffset(days=i)).strftime('%Y%m%d') \
                                   for i in [90, 0]]
    except:
        return u'缺失值'

    try:
        if BTM_.has_key('indent') and BTM_['indent'] not in null_type_list \
            and BTM_.has_key('periods') and len(BTM_['indent']) >= 1:
            if BTM_['periods'] not in null_type_list:
                periods_list = BTM_['periods'].split(':')
                if len(periods_list) == 2 and periods_list[0].isdigit() and periods_list[1].isdigit():
                    periods = float(periods_list[0])
                else:
                    periods = float(7)
            else:
                periods = float(7)

            for i in BTM_['indent']:
                if i.has_key('indentDate') and i['indentDate'] not in null_type_list \
                    and Formate(i['indentDate']) is not None \
                        and Formate(i['indentDate']) > last_year_days_list[0] \
                        and Formate(i['indentDate']) <= last_year_days_list[1]:

                        tmp = datetime.datetime.strptime(Formate(i['indentDate']),'%Y%m%d')
                        indent_date.append(tmp)

            indent_date = sorted(indent_date, reverse=True)
            max_ = []

            for k in xrange(len(indent_date)-1):
                max_.append(((indent_date[k] - indent_date[k+1]).days))

            if periods != float(0):
                return round(max(max_)/periods, 4)
            else:
                return u'缺失值'
        else:
            return u'缺失值'
    except:
        return u'缺失值'

#统一时间格式为'20180528'-> '%Y%m%d'
def Formate(time):
    import re
    import datetime
    r = re.compile(r'\D+')
    try:
        date = datetime.datetime.strptime(time, '%Y.%m.%d').strftime('%Y%m%d')
    except:
        try:
            date = datetime.datetime.strptime(time, '%Y-%m-%d').strftime('%Y%m%d')
        except:
            try:
                date = datetime.datetime.strptime(time, '%Y/%m/%d').strftime('%Y%m%d')
            except:
                try:
                    tmp = r.sub('', time)
                    date = datetime.datetime.strptime(tmp, '%Y%m%d').strftime('%Y%m%d')
                except:
                    date = None
    return date


result = Mon3MaxPeriods()